package com.oldbook.common.filter;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 敏感词过滤器类，基于字典树（Trie树）实现敏感词的存储和快速检测
 */
public class SensitiveWordFilter {
    private static final Character END_FLAG = '\0'; // 特殊字符作为结束标记
    private final Map<Character, Map> sensitiveMap = new HashMap<>();

    /**
     * 构造函数，构建敏感词字典树结构
     * @param words 敏感词列表，用于初始化字典树的基础数据
     */
    public SensitiveWordFilter(List<String> words) {
        // 构建字典树结构：每个字符作为树节点，通过嵌套Map形成树状结构
        for (String word : words) {
            Map<Character, Map> current = sensitiveMap;
            for (char c : word.toCharArray()) {
                // 为每个字符创建子节点（如果不存在则新建）
                current = current.computeIfAbsent(c, k -> new HashMap<>());
            }
            // 在单词结尾处添加特殊结束标记
            current.put(END_FLAG, null);
        }
    }

    /**
     * 检测文本是否包含敏感词
     * @param text 待检测的输入文本
     * @return 包含敏感词返回true，否则返回false
     */
    public boolean contains(String text) {
        // 双重循环遍历所有可能的子字符串组合
        for (int i = 0; i < text.length(); i++) {
            Map<Character, Map> temp = sensitiveMap;
            // 从当前字符开始向下搜索字典树
            for (int j = i; j < text.length(); j++) {
                temp = temp.get(text.charAt(j));
                if (temp == null) {
                    break;
                }
                // 发现完整敏感词特征（遇到结束标记）
                if (temp.containsKey(END_FLAG)) {
                    return true;
                }
            }
        }
        return false;
    }
}
